//加载module会运行  会缓存，只会加载一次
//__dirname  __filename 文件绝对路径
const {
    sleep,
    sum
} = require('./demo');
// import {count, delay} from './demo' //node 不支持 es6 import

sleep("liY", 3000).then(console.log);

console.log("module test");

// callback -> promise  Error-first
// const readFile = util.promisify(fs.readFile); 
// readFile(filePath).then(data => console.log(data.toString())); 


function name() {
    console.log(this);
}
const arr = [1, 4, 7, 9, 12];

name.apply(arr); //arg数组
// name.call(arr);
// name.bind(arr)();

obj = {
    "name": "huang",
    arr,
    say: () => {
        let self = this;
        console.log(self); // undefined
    },
    method() {
        // arrow 函数 this为method this
        this.arr.forEach((element, index) => {
            if (index === 1) 
            console.log(this.name);
        });

        let self = this;
        // forEach 由 global/windows调用
        this.arr.forEach(function(element, index) {
            if (index === 1) 
            console.log(this.name); //
        }.bind(this)); //可以绑定this
      }
};

(() => console.log(this.name)).bind(obj)();


//箭头函数不适应：1.定义函数的方法，且该方法内部包括this 2.监听函数

/*
每一个用function声明的函数在调用时都会在函数内创建自己的this。this一般是函数所操作的对象。如果没有操作的对象。this undefined/window。
也就是说，function声明的函数总是有自己的this。从而遮盖外层作用域中的this。
如果用es6的箭头函数()=>{}就没有自己的this。在箭头函数()=>{}中访问this，是访问外层作用域中的this。
所以在箭头函数里写的 this 其实是包含该箭头函数最近的一个 function 上下文中的 this (闭包)
*/


/* 
构造器函数，不能有返回值，如果有，是值类型则忽略，是引用类型则返回这个对象。 
***普通回调CB的this指向全局，arrow函数***
*/
obj.method();